﻿/* Inserir */

-- Inserir Bebida
CREATE FUNCTION inserir_bebida
( nome CHARACTER VARYING, descricao CHARACTER VARYING, preco MONEY) 
RETURNS integer AS $$
Declare
BEGIN
	IF(nome is not null AND descricao is not null AND preco is not null) THEN
		INSERT INTO bebida VALUES (nome, descricao, preco, removido);
		return 1;
	ELSE
		return 0;
	END IF;	
END;
$$ LANGUAGE 'plpgsql';

-- Inserir Garçom
CREATE FUNCTION inserir_garcom
(nome CHARACTER VARYING) 
RETURNS INTEGER AS $$
Declare
BEGIN
	IF(nome is not null ) THEN
		INSERT INTO garcom (nome) VALUES (nome);
		return 1;
	ELSE
		return 0;
	END IF;
END;
$$ LANGUAGE 'plpgsql';

-- Inserir Mesa
CREATE FUNCTION inserir_mesa
( numero INTEGER, quantidade_lugares INTEGER) 
RETURNS integer AS $$
BEGIN
	IF(numero is not null AND quantidade_lugares is not null) THEN
		INSERT INTO mesa (numero,quantidade_lugares) VALUES (numero, quantidade_lugares);
		return 1;
	ELSE
		return 0;
	END IF;
END;
$$ LANGUAGE 'plpgsql';

-- Inserir Pedido
CREATE OR REPLACE FUNCTION inserir_pedido( data DATE, id_garcom INTEGER , id_mesa INTEGER, ids_pratos INTEGER[], ids_bebidas INTEGER[], qte_bebida INTEGER[], qte_prato INTEGER[]) 
RETURNS CHARACTER VARYING AS $$
Declare id_pedido INTEGER; control INTEGER :=1; total integer;
BEGIN
	IF(data is null OR status is null OR id_garcom is null OR id_mesa is null OR ids_pratos is null OR ids_bebidas is null OR qte_bebida is null OR qte_prato is null)THEN
		return 'Os campos nao podem ser nulos.';
	END IF;
	INSERT INTO pedido (data,status,id_garcom, id_mesa) VALUES (data,1,id_garcom,id_mesa);
	select currval(pg_get_serial_sequence('pedido','id')) into id_pedido;
	select array_length(ids_pratos,1) into total;
	WHILE control<=total LOOP
		INSERT INTO pedido_bebida VALUES (id_pedido,ids_bebidas[control],qte_bebida[control]);
		INSERT INTO pedido_prato VALUES (ids_pratos[control],id_pedido,qte_prato[control]);
		control := control+1;
	END LOOP;
	return 'Pedido inserido.';
END;
$$ LANGUAGE 'plpgsql'; 

-- Inserir Pedido de Bebida
CREATE FUNCTION inserir_pedido_bebida
( id_pedido INTEGER, id_bebida INTEGER, quantidade INTEGER) 
RETURNS void AS $$
BEGIN
	INSERT INTO pedido_bebida VALUES (id_pedido, id_bebida, quantidade);
END;
$$ LANGUAGE 'plpgsql';

-- Inserir Pedido de Prato
CREATE FUNCTION inserir_pedido_prato
( id_prato INTEGER, id_pedido INTEGER, quantidade INTEGER) 
RETURNS void AS $$
BEGIN
	INSERT INTO pedido_prato VALUES (id_prato, id_pedido, quantidade);
END;
$$ LANGUAGE 'plpgsql';

-- Inserir prato
CREATE FUNCTION inserir_prato
( nome CHARACTER VARYING, descricao CHARACTER VARYING, preco MONEY) 
RETURNS integer AS $$
BEGIN
	IF(nome is not null AND descricao is not null AND preco is not null) THEN
		INSERT INTO prato (nome,descricao,preco) VALUES (nome,descricao,preco);
		return 1;
	ELSE
		return 0;
	END IF;
END;
$$ LANGUAGE 'plpgsql';

-- Inserir Produto
CREATE FUNCTION inserir_produto
( nome CHARACTER VARYING, disponivel INTEGER, valor MONEY) 
RETURNS integer AS $$
Declare
BEGIN
	IF(nome is not null AND disponivel is not null AND valor is not null) THEN
		INSERT INTO prato (nome,disponivel,valor) VALUES (nome,disponivel,valor);
		return 1;
	ELSE
		return 0;
	END IF;
END;
$$ LANGUAGE 'plpgsql';

-- Inserir Produto Prato
CREATE FUNCTION inserir_produto_prato( id_produto INTEGER, id_prato INTEGER) 
RETURNS integer AS $$
Declare
BEGIN
	IF(id_produto is not null AND id_prato is not null) THEN
		INSERT INTO produto_prato (id_produto,id_prato) VALUES (id_produto,id_prato);
		return 1;
	ELSE
		return 0;
	END IF;
END;
$$ LANGUAGE 'plpgsql';

-- Inserir Reserva
CREATE FUNCTION inserir_reserva
( data DATE, id_mesa INTEGER) 
RETURNS void AS $$
Declare
BEGIN
	INSERT INTO reserva VALUES (data, id_mesa);
END;
$$ LANGUAGE 'plpgsql';



/* Atualizar */

-- Atualizar Bebida
CREATE OR REPLACE FUNCTION atualizar_bebida(id integer, nome character varying, descricao character varying, preco money) RETURNS integer AS $$
BEGIN
	IF(id is null) THEN
		return 0;
	END IF;
	IF(nome is not null)THEN
		UPDATE bebida SET nome = nome WHERE id = id;
	END IF;
	IF(descricao is not null)THEN
		UPDATE bebida SET descricao = descricao WHERE id = id;
	END IF;
	IF(preco is not null)THEN
		UPDATE bebida SET preco = preco WHERE id = id;
	END IF;
	RETURN 1;
END;
$$ LANGUAGE 'plpgsql';

-- Atualizar Garçom
CREATE OR REPLACE FUNCTION atualizar_garcom( id INTEGER, nome CHARACTER VARYING) 
RETURNS INTEGER AS $$
BEGIN
	IF(id is null OR nome is null)THEN
		RETURN 0;
	END IF;
	UPDATE garcom SET nome = nome WHERE id = id;
	RETURN 1;
END;
$$ LANGUAGE 'plpgsql';

-- Atualizar Mesa
CREATE OR REPLACE FUNCTION atualizar_mesa( id INTEGER, quantidade_lugares INTEGER) 
RETURNS INTEGER AS $$
BEGIN
	IF(id is null OR quantidade_lugares is null) THEN
		return 0;
	END IF;
	UPDATE mesa SET quantidade_lugares = quantidade_lugares WHERE id = id;
	RETURN 1;
END;
$$ LANGUAGE 'plpgsql';

-- Atualizar Pedido
CREATE OR REPLACE FUNCTION atualizar_pedido
( id INTEGER, data DATE, tipo_status status, id_garcom INTEGER , id_mesa INTEGER) 
RETURNS INTEGER AS $$
BEGIN
	IF(id < 1) THEN
		return 0;
	END IF;
	UPDATE pedido SET data = $2, status = $3, id_garcom = $4, id_mesa = $5 WHERE id = $1;
	RETURN (SELECT @@ROWCOUNT);
END;
$$ LANGUAGE 'plpgsql';

-- Atualizar Pedido de Bebida
CREATE OR REPLACE FUNCTION atualizar_pedido_bebida
( id_pedido INTEGER, id_bebida INTEGER, quantidade INTEGER) 
RETURNS INTEGER AS $$
BEGIN
	IF(id_pedido < 1 or id_bebida < 1) THEN
		return 0;
	END IF;
	UPDATE pedido_bebida SET quantidade = $3 WHERE id_pedido = $1 AND id_bebida = $2;
	RETURN (SELECT @@ROWCOUNT);
END;
$$ LANGUAGE 'plpgsql';

-- Atualizar Pedido de Prato
CREATE OR REPLACE FUNCTION atualizar_pedido_prato
( id_prato INTEGER, id_pedido INTEGER, quantidade INTEGER) 
RETURNS INTEGER AS $$
BEGIN
	IF(id_prato < 1 or id_pedido < 1) THEN
		return 0;
	END IF;
	UPDATE pedido_prato SET quantidade = $3 WHERE id_prato = $1 AND id_pedido = $2;
	RETURN (SELECT @@ROWCOUNT);
END;
$$ LANGUAGE 'plpgsql';

-- Atualizar Prato
CREATE OR REPLACE FUNCTION atualizar_prato( id INTEGER, nome CHARACTER VARYING, descricao CHARACTER VARYING, preco MONEY) RETURNS INTEGER AS $$
BEGIN
	IF(id is null OR id = 0) THEN
		return 0;
	END IF;
	IF(nome is not null)THEN
		UPDATE prato SET nome = nome WHERE id = id;
	END IF;
	IF(descricao is not null)THEN
		UPDATE prato SET descricao = descricao WHERE id = id;
	END IF;
	IF(preco is not null)THEN
		UPDATE prato SET preco = preco WHERE id = id;
	END IF;	
	RETURN 1;
END;
$$ LANGUAGE 'plpgsql';

-- Atualizar Produto
CREATE OR REPLACE FUNCTION atualizar_produto
( id INTEGER, nome CHARACTER VARYING, disponivel INTEGER, valor MONEY) RETURNS INTEGER AS $$
BEGIN
	IF(id is null) THEN
		return 0;
	END IF;
	IF(nome is null)THEN
		UPDATE produto SET  disponivel = disponivel, valor = valor WHERE id = id;
	END IF;
	IF(disponivel is null)THEN
		UPDATE produto SET  nome = nome, valor = valor WHERE id = id;
	END IF;
	IF(valor is null)THEN
		UPDATE produto SET  nome = nome, disponivel = disponivel WHERE id = id;
	END IF;
	UPDATE produto SET nome = $2, disponivel = $3, valor = $4 WHERE id = $1;
	RETURN 1;
END;
$$ LANGUAGE 'plpgsql';

/* Atualizar Produto Prato*/
CREATE OR REPLACE FUNCTION atualizar_produto_prato( id_produto INTEGER, id_prato INTEGER) RETURNS INTEGER AS $$
BEGIN
	IF(id_produto is not null or id_prato is not null) THEN
		return 0;
	END IF;
	UPDATE produto_prato SET  WHERE id_produto = $1 AND id_prato = $2;
	RETURN (SELECT @@ROWCOUNT);
END;
$$ LANGUAGE 'plpgsql'; 



/* Excluir */

-- Fechar Pedido
CREATE OR REPLACE FUNCTION fechar_conta( id_mesa INTEGER) 
RETURNS NUMERIC(8,2) AS $$
Declare total_pratos NUMERIC(8,2);total_bebidas NUMERIC(8,2);
BEGIN
	SELECT total_pratos($1) INTO total_pratos;
	SELECT total_bebidas($1) INTO total_bebidas;
	UPDATE pedido SET status=2 WHERE id IN (SELECT p.id FROM mesa AS m INNER JOIN pedido AS p ON (p.id_mesa=$1) WHERE status = 1);
	RETURN total_pratos+total_bebidas;
END;
$$ LANGUAGE 'plpgsql';



/* Valor total */

-- Valor total dos pratos do pedido
CREATE FUNCTION pedidos_mesa(id_mesa INTEGER)
RETURNS VOID AS $$
Declare total NUMERIC(8,2);
BEGIN
	SELECT p.id FROM mesa AS m
	INNER JOIN pedido AS p ON (p.id_mesa=$1)
	WHERE status = 1;
END;
$$ LANGUAGE 'plpgsql';

-- Valor total dos pratos pedidos
CREATE OR REPLACE FUNCTION total_pratos( id_mesa INTEGER)
RETURNS NUMERIC(8,2) AS $$
Declare total NUMERIC(8,2);
BEGIN
	SELECT SUM(p.preco*pp.quantidade) FROM prato AS p
	INNER JOIN pedido AS pe on (pe.id_mesa=$1)
	INNER JOIN pedido_prato AS pp on (pp.id_pedido=pe.id and p.id=pp.id_prato)
	WHERE pe.status=1 INTO total;
	RETURN total;	
END;
$$ LANGUAGE 'plpgsql';

-- Valor total das bebidas pedidas

CREATE OR REPLACE FUNCTION total_bebidas( id_mesa INTEGER) 
RETURNS NUMERIC(8,2) AS $$
Declare total NUMERIC(8,2);
BEGIN
	SELECT SUM(b.preco*pp.quantidade) FROM bebida AS b
	INNER JOIN pedido AS pe on (pe.id_mesa=$1)
	INNER JOIN pedido_bebida AS pp on (pp.id_pedido=pe.id and b.id=pp.id_bebida)
	WHERE pe.status=1 into total;
	RETURN total;	
END;
$$ LANGUAGE 'plpgsql';